#include "Actor.h"
#include "HuevoBlanco.h"
#include "HuevoCodorniz.h"
#include "HuevoPoche.h"
#include "HuevoReloj.h"
#include "PajaritoAzul.h"
#include "PajaritoRojo.h"
#include "PajaritoVerde.h"

using namespace TP::Juego::Arena::Actores;

Actor::Actor (){}

Actor::Actor(const string& pNombre, Rol* pRol) {
    this->_nombre = pNombre;
    this->_rol = pRol;
}

Actor::~Actor() {
    if (this->_rol)
        delete this->_rol;
}

string& Actor::Nombre(){
    return this->_nombre;
}

Trayectoria* Actor::getTrayectoria (){
    return this->_trayectoria;
}

Trayectoria* Actor::setTrayectoria (Trayectoria* pTrayectoria){

    this->_trayectoria = pTrayectoria;
    return pTrayectoria;
}

Ticks Actor::desplazar(Ticks pTiempo){
    return this->_trayectoria->desplazar(pTiempo);
}

Rol* Actor::getRol (){
    return this->_rol;
}


string& Actor::setNombre(const string& pNombre){
    this->_nombre = pNombre;
    return this->Nombre();
}

Actor* Actor::deElementoXMLGenerico (TiXmlElement* pElemento){
    
    Actor* actor = NULL;
    
    if (pElemento)
    {
        if (PAJARITOAZUL == pElemento->ValueTStr())
            actor = new PajaritoAzul();

        else if (PAJARITOROJO == pElemento->ValueTStr())
            actor = new PajaritoRojo();
        
        else if (PAJARITOVERDE == pElemento->ValueTStr())
            actor = new PajaritoVerde();

        else if (HUEVOBLANCO == pElemento->ValueTStr())
            actor = new HuevoBlanco();

        else if (HUEVOCODORNIZ == pElemento->ValueTStr())
            actor = new HuevoCodorniz();

        else if (HUEVOPOCHE == pElemento->ValueTStr())
            actor = new HuevoPoche();
        
        else if (HUEVORELOJ == pElemento->ValueTStr())
            actor = new HuevoReloj();
        
        if (actor)
            actor->deElementoXML(pElemento);
    }
    
    return actor;
}

double Actor::getVida() {
    return _vida;
}

void Actor::setVida(double vida) {
    _vida = vida;
}

void Actor::destruir() {
    _vida = 0;
}

double Actor::decrementarEnergia (double pCantidadEnergia) {
    if(pCantidadEnergia >= _vida)
        destruir();
    else
        _vida -= pCantidadEnergia;
}

bool Actor::destruido() const {
    return _vida == 0.0;
}